<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Reflexion (Programmierung)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Reflexion_(Programmierung)"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Reflexion_Programmierung rootpage-Reflexion_Programmierung skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Reflexion (Programmierung)</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><b>Reflexion</b> (<span style="font-style:normal;font-weight:normal"><a href="Englische_Sprache" title="Englische Sprache">englisch</a></span> <span lang="en-Latn" style="font-style:italic">reflection</span>) bedeutet in der <a href="Programmierung" title="Programmierung">Programmierung</a>, dass ein <a href="Computerprogramm" title="Computerprogramm">Programm</a> seine eigene Struktur kennt (englisch <i>introspection</i>) und/oder diese modifizieren kann (englisch <i>intercession</i>).<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Details">Details</h2></div>
<p>Reflexion ermöglicht bei <a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">objektorientierter Programmierung</a> beispielsweise zur <a href="Laufzeit_(Informatik)" title="Laufzeit (Informatik)">Laufzeit</a> die Abfrage von Informationen über die <a href="Klasse_(Objektorientierung)" title="Klasse (Objektorientierung)">Klassen</a>, aus denen <a href="Objekt_(Programmierung)#Instanziierung" title="Objekt (Programmierung)">Objekte</a> instanziiert werden. Bei einer Klasse sind dies beispielsweise der Name der Klasse, die definierten Felder und Methoden. Bei einer Methode sind das wiederum deren <a href="Variable_(Programmierung)" title="Variable (Programmierung)">Sichtbarkeit</a>, der <a href="Datentyp" title="Datentyp">Datentyp</a> des Rückgabewertes oder der Typ der <a href="Parameter_(Informatik)" title="Parameter (Informatik)">Übergabeparameter</a>. Die Umsetzung der Abfragemöglichkeiten ist sprachspezifisch.
</p><p>Reflexion ist eine Voraussetzung für die <a href="Typsicherheit#Statische_und_dynamische_Typsicherheit" title="Typsicherheit">dynamische Typsicherheit</a>. Typen werden hierbei zur Ausführungszeit überprüft und können reflexiv abgefragt werden. Ebenso wird sie für die Realisierung von <a href="Persistenz_(Informatik)" title="Persistenz (Informatik)">Persistenz</a> (persistente Datenhaltung von Objekten und deren <a href="Relation_(Philosophie)" title="Relation (Philosophie)">Beziehungen</a>) verwendet: Welche Daten zu speichern sind, kann die <a href="Persistenz_(Informatik)" title="Persistenz (Informatik)">Persistenz</a>-Realisierung zur Laufzeit über Reflexion erfragen. Für unterschiedliche (Objekt-)Strukturen müssen dann keine spezifischen Speicherfunktionen implementiert werden.
</p><p>Die Ausführungsgeschwindigkeit von Code per Reflexion ist für gewöhnlich geringer als die von statischem Code. Dies liegt unter anderem an den String-Vergleichen der entsprechenden Namen der gewünschten Methoden, Eigenschaften usw. mit den Einträgen in den Metadaten. Jedoch bietet Reflexion eine sehr hohe Laufzeitflexibilität, da Code dynamisch aufgerufen werden kann, neue Instanzen erstellt oder sogar Typen und Objekte dynamisch neu strukturiert werden können.
</p>
<div class="mw-heading mw-heading2"><h2 id="Sprachunterstützung"><span id="Sprachunterst.C3.BCtzung"></span>Sprachunterstützung</h2></div>
<p>Für die Realisierung der Reflexion ist das Speichern von <a href="Metadaten" title="Metadaten">Metainformation</a> im ausführbaren Code des Programms notwendig, welche zur <a href="Laufzeit_(Informatik)" title="Laufzeit (Informatik)">Laufzeit</a> ausgelesen wird.
</p><p>Bei interpretierenden <a href="Programmiersprache" title="Programmiersprache">Programmiersprachen</a> liegt zur Ausführungszeit der ursprüngliche Programmcode vor, was neben dem Zugriff auf die Strukturinformation (Methodendeklaration) auch den Zugriff auf die Implementierung ermöglicht. Beispiele dafür sind <a href="PHP" title="PHP">PHP</a>, <a href="Lisp" title="Lisp">Lisp</a>, <a href="Python_(Programmiersprache)" title="Python (Programmiersprache)">Python</a>, <a href="Smalltalk_(Programmiersprache)" title="Smalltalk (Programmiersprache)">Smalltalk</a> und <a href="Tcl" title="Tcl">Tcl</a>.
</p><p>Weiterhin wird Reflexion häufig von Frameworks oder Sprachen unterstützt, die in einer virtuellen Maschine ausgeführt werden, beispielsweise <a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> oder <a href="Smalltalk_(Programmiersprache)" title="Smalltalk (Programmiersprache)">Smalltalk</a>. Auch alle Sprachen, die das <a href=".Net-Framework" title=".Net-Framework">.Net-Framework</a> verwenden, müssen laut der <a href="Common_Language_Specification" title="Common Language Specification">Common Language Specification</a> (CLS) die für Reflexion notwendigen Informationen als Metadaten speichern, wie z. B. <a href="C-Sharp" title="C-Sharp">C#</a>, <a href="Object_Pascal" title="Object Pascal">Object Pascal</a>, <a href="Visual_Basic_.NET" title="Visual Basic .NET">VB.NET</a> oder <a href="IronPython" title="IronPython">IronPython</a>.
</p><p>Im Prinzip kann auch <a href="Maschinensprache" title="Maschinensprache">Maschinencode</a> im <a href="Random-Access_Memory" title="Random-Access Memory">RAM</a>, der von einem <a href="Mikroprozessor" title="Mikroprozessor">Mikroprozessor</a> ausgeführt wird, als reflexiv betrachtet werden. Ein solches Programm ist in der Lage, seine Anweisungen wie Daten zu behandeln, und kann deshalb seine Struktur analysieren und verändern.
</p>
<div class="mw-heading mw-heading2"><h2 id="Beispiele">Beispiele</h2></div>
<div class="mw-heading mw-heading3"><h3 id="C#"><span id="C.23"></span>C#</h3></div>
<p>Das folgende Beispiel zeigt eine Methode, die eine beliebige andere Methode eines gegebenen Objekts aufruft und deren Rückgabewert zurückgibt. Aus Gründen der Vereinfachung unterstützt dieses Beispiel nur den Aufruf von Methoden ohne Parameter, die Zeichenketten ("String") zurückgeben.
</p>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span></span><span class="k">public</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="nf">GetStringProperty</span><span class="p">(</span><span class="n">Object</span><span class="w"> </span><span class="n">obj</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">methodName</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="p">;</span>
<span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">MethodInfo</span><span class="w"> </span><span class="n">methodInfo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">obj</span><span class="p">.</span><span class="n">GetType</span><span class="p">().</span><span class="n">GetMethod</span><span class="p">(</span><span class="n">methodName</span><span class="p">);</span>
<span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="p">)</span><span class="n">methodInfo</span><span class="p">.</span><span class="n">Invoke</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Object</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">//Fehlerbehandlung zwecks Übersichtlichkeit nicht implementiert.</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Java">Java</h3></div>
<p>Das folgende Beispiel zeigt eine Methode, die der Funktionalität des C#-Beispiels entspricht.
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">getStringProperty</span><span class="p">(</span><span class="n">Object</span><span class="w"> </span><span class="n">object</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">methodName</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Method</span><span class="w"> </span><span class="n">getter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">object</span><span class="p">.</span><span class="na">getClass</span><span class="p">().</span><span class="na">getMethod</span><span class="p">(</span><span class="n">methodName</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Class</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">);</span>
<span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">String</span><span class="p">)</span><span class="w"> </span><span class="n">getter</span><span class="p">.</span><span class="na">invoke</span><span class="p">(</span><span class="n">object</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Object</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">//Fehlerbehandlung zwecks Übersichtlichkeit nicht implementiert.</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">value</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>Die folgende Anweisung würde dann die Methode <code>getVorname()</code> des Objekts <code>person</code> aufrufen und deren Rückgabewert ausgeben.
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">"Vorname von "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">person</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" ist "</span>
<span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">getStringProperty</span><span class="p">(</span><span class="n">person</span><span class="p">,</span><span class="w"> </span><span class="s">"getVorname"</span><span class="p">));</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Common_Lisp">Common Lisp</h3></div>
<div class="mw-highlight mw-highlight-lang-lisp mw-content-ltr" dir="ltr"><pre><span></span><span class="p">(</span><span class="nb">funcall</span><span class="w"> </span><span class="p">(</span><span class="nb">find-symbol</span><span class="w"> </span><span class="s">"SIN"</span><span class="p">)</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="PHP">PHP</h3></div>
<div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">$reflectionExampleObj</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ReflectionClass</span><span class="p">(</span><span class="s1">'ExampleClass'</span><span class="p">);</span>
<span class="nx">Reflection</span><span class="o">::</span><span class="na">export</span><span class="p">(</span><span class="nv">$reflectionExampleObj</span><span class="p">);</span>
</pre></div>
<p>Die angegebene Anweisung würde dann die Eigenschaften der Klasse "ExampleClass" als Ausgabe zurückliefern.
</p><p>Die folgende Anweisung liefert beispielsweise die statischen Variablen der Klasse, wenn welche existieren:
</p>
<div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">$reflectionExampleObj</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ReflectionClass</span><span class="p">(</span><span class="s1">'ExampleClass'</span><span class="p">);</span>
<span class="nv">$reflectionExampleObj</span><span class="o">-></span><span class="na">getStaticVariables</span><span class="p">();</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Python">Python</h3></div>
<p>Die Namen der Attribute eines Objekts können mit der eingebauten Funktion <code>dir</code> ermittelt werden.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p><p>Das Attribute <code>__doc__</code> enthält die Dokumentation eines Objects.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>
</p><p>
Das Standardmodul <code>inspect</code> erlaubt den Zugriff auf viele Eigenschaften von Python-Objekten, einschließlich Python-Code.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup></p><div class="mw-highlight mw-highlight-lang-python mw-content-ltr" dir="ltr"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Person</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">def</span><span class="w"> </span><span class="nf">say_hello</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""Grüße die Person."""</span>
<span class="k">return</span> <span class="s1">'Hallo </span><span class="si">%s</span><span class="s1">!'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
<span class="n">ute</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="s1">'Ute'</span><span class="p">)</span>
<span class="c1"># direkter Aufruf</span>
<span class="n">ute</span><span class="o">.</span><span class="n">say_hello</span><span class="p">()</span>
<span class="c1"># Hallo Ute!</span>
<span class="c1"># Reflexion: Ermittle alle Attribute der Klasse Person</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">dir</span><span class="p">(</span><span class="n">ute</span><span class="p">))</span>
<span class="c1"># ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_hello']</span>
<span class="c1"># Reflexion: Zeige die Dokumentation der Method say_hello an</span>
<span class="nb">print</span><span class="p">(</span><span class="n">ute</span><span class="o">.</span><span class="n">say_hello</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">)</span>
<span class="c1"># Grüße die Person</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Ruby">Ruby</h3></div>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="s2">"a String"</span><span class="o">.</span><span class="n">class</span><span class="w"> </span><span class="c1"># ergibt "String"</span>
<span class="s2">"a String"</span><span class="o">.</span><span class="n">respond_to?</span><span class="p">(</span><span class="ss">:size</span><span class="p">)</span><span class="w"> </span><span class="c1"># ergibt true -> Objekt kann Methode size ausführen</span>
<span class="s2">"a String"</span><span class="o">.</span><span class="n">methods</span><span class="w"> </span><span class="c1"># ergibt einen Array mit allen Methoden des Objektes</span>
<span class="s2">"a String"</span><span class="o">.</span><span class="n">method</span><span class="p">(</span><span class="ss">:concat</span><span class="p">)</span><span class="o">.</span><span class="n">arity</span><span class="w"> </span><span class="c1"># gibt die Anzahl der Parameter an,</span>
<span class="w"> </span><span class="c1"># die die Methode concat verlangt</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Book</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span><span class="p">(</span><span class="o">*</span><span class="n">parameters</span><span class="p">)</span>
<span class="w"> </span><span class="vi">@title</span><span class="p">,</span><span class="w"> </span><span class="vi">@author</span><span class="p">,</span><span class="w"> </span><span class="vi">@chapters</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parameters</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>
<span class="n">a_book</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Book</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">"Book Title"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Someone"</span><span class="p">,</span><span class="w"> </span><span class="o">[</span><span class="s2">"chapter I"</span><span class="p">,</span><span class="w"> </span><span class="s2">"chapter II"</span><span class="p">,</span><span class="w"> </span><span class="s2">"chapter III"</span><span class="o">]</span><span class="p">)</span>
<span class="n">a_book</span><span class="o">.</span><span class="n">instance_variables</span><span class="w"> </span><span class="c1"># ergibt einen Array aller Objektinstanzvariablen:</span>
<span class="w"> </span><span class="c1"># ["@title", "@author", "@chapters"]</span>
<span class="no">Book</span><span class="o">.</span><span class="n">instance_methods</span><span class="w"> </span><span class="c1"># gibt alle Instanzmethoden der Klasse Book aus.</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Smalltalk">Smalltalk</h3></div>
<p>Statt Methodenaufrufen auf Objekten werden diesen in Smalltalk Nachrichten gesendet. Die Methoden, welche Reflexion ermöglichen, haben ähnliche Namen wie in Ruby.
</p>
<div class="mw-highlight mw-highlight-lang-smalltalk mw-content-ltr" dir="ltr"><pre><span></span><span class="s">'a String'</span> <span class="nf">class</span><span class="p">.</span> <span class="c">" ergibt String"</span>
<span class="s">'a String'</span> <span class="nf">respondsTo:</span> <span class="ss">#size</span><span class="p">.</span> <span class="c">" ergibt true"</span>
<span class="s">'a String'</span> <span class="nf">class</span> <span class="nf">methodDictionary</span><span class="p">.</span> <span class="c">" ergibt ein Dictionary mit allen Methoden"</span>
(<span class="s">'a String'</span> <span class="nf">class</span> <span class="nf">compiledMethodAt:</span> <span class="ss">#,</span>) <span class="nf">numArgs</span> <span class="c">" ergibt 1"</span>
</pre></div><p>Man kann auch den Quellcode einer Methode erfragen:</p><div class="mw-highlight mw-highlight-lang-smalltalk mw-content-ltr" dir="ltr"><pre><span></span><span class="s">'a String'</span> <span class="nf">class</span> <span class="nf">sourceCodeAt:</span> <span class="ss">#size</span> <span class="c">" ergibt 'size</span>
<span class="c"> ""Answer the number of indexable fields in the receiver. This value is the </span>
<span class="c"> same as the largest legal subscript. Primitive is specified here to override </span>
<span class="c"> SequenceableCollection size. Essential. See Object documentation </span>
<span class="c"> whatIsAPrimitive. "</span><span class="err">"</span>
<span class="nf"><primitive:</span> <span class="nv">62</span><span class="err">></span>
<span class="o">^</span><span class="bp">self</span> <span class="nf">basicSize</span><span class="err">'</span> <span class="p">.</span>
</pre></div><p>Eine einfache Beispielklasse, die ein Buch modelliert:</p><div class="mw-highlight mw-highlight-lang-smalltalk mw-content-ltr" dir="ltr"><pre><span></span><span class="nc">Object</span> <span class="nf">subclass:</span> <span class="ss">#Book</span>
<span class="nf">instanceVariableNames:</span> <span class="s">'title author chapters'</span>
<span class="nf">classVariableNames:</span> <span class="s">''</span>
<span class="nf">poolDictionaries:</span> <span class="s">''</span>
<span class="nf">category:</span> <span class="s">'Wikipedia'</span>
</pre></div><p>Die Initialisierungsmethode:</p><div class="mw-highlight mw-highlight-lang-smalltalk mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">initializeFrom:</span> <span class="nv">aParameterCollection</span>
<span class="c">"Initialisiere diese Instanz mit den in aParameterCollection gesendeten Parametern."</span>
<span class="nv">title</span> <span class="o">:=</span> <span class="nv">aParameterCollection</span> <span class="nf">first</span><span class="p">.</span>
<span class="nv">author</span> <span class="o">:=</span> <span class="nv">aParameterCollection</span> <span class="nf">second</span><span class="p">.</span>
<span class="nv">chapters</span> <span class="o">:=</span> <span class="nv">aParameterCollection</span> <span class="nf">third</span>
</pre></div><p>Man kann nun direkt die Klasse <code>Book</code> nach ihren Instanzvariablen fragen:</p><div class="mw-highlight mw-highlight-lang-smalltalk mw-content-ltr" dir="ltr"><pre><span></span><span class="nc">Book</span> <span class="nf">instVarNames</span><span class="p">.</span> <span class="c">" ergibt #('title' 'author' 'chapters')"</span>
</pre></div><p>Auch kann man alle Methoden erfragen:</p><div class="mw-highlight mw-highlight-lang-smalltalk mw-content-ltr" dir="ltr"><pre><span></span><span class="nc">Book</span> <span class="nf">methodDictionary</span> <span class="c">"ergibt a MethodDictionary(#initializeFrom:->(Book>>#initializeFrom: ""a CompiledMethod:65(3016448)"") )"</span>
</pre></div><p>Man kann auch hier Quellcode einer Methode erfragen:</p><div class="mw-highlight mw-highlight-lang-smalltalk mw-content-ltr" dir="ltr"><pre><span></span><span class="nc">Book</span> <span class="nf">sourceCodeAt:</span> <span class="ss">#initializeFrom:</span> <span class="c">" ergibt: 'initializeFrom: aParameterCollection</span>
<span class="c"> ""Initialisiere diese Instanz mit den in aParameterCollection gesendeten Parametern.""</span>
<span class="c"> </span>
<span class="c"> title := aParameterCollection first.</span>
<span class="c"> author := aParameterCollection second.</span>
<span class="c"> chapters := aParameterCollection third' "</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Tcl">Tcl</h3></div>
<p>Das folgende Beispiel zeigt eine Methode <code>rufe</code>, die der Funktionalität des obigen C#- und Java-Beispiels entspricht.
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">oo</span><span class="o">::</span>class<span class="w"> </span>create<span class="w"> </span>Person<span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">variable</span><span class="w"> </span>name<span class="w"> </span>vorname
<span class="w"> </span><span class="nv">constructor</span><span class="w"> </span><span class="k">{</span><span class="nv">n</span><span class="w"> </span>v<span class="k">}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">set</span><span class="w"> </span>name<span class="w"> </span><span class="nv">$n</span>
<span class="w"> </span><span class="k">set</span><span class="w"> </span>vorname<span class="w"> </span><span class="nv">$v</span>
<span class="w"> </span><span class="k">}</span>
<span class="w"> </span><span class="c"># Diese gewöhnliche, parameterlose Methode liefert den Vornamen</span>
<span class="w"> </span><span class="nv">method</span><span class="w"> </span>getVorname<span class="w"> </span><span class="k">{}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nv">$vorname</span>
<span class="w"> </span><span class="k">}</span>
<span class="w"> </span><span class="c"># Diese Methode ruft die Methode auf, deren Name als Parameter mitgegeben wird.</span>
<span class="w"> </span><span class="nv">method</span><span class="w"> </span>rufe<span class="w"> </span><span class="k">{</span><span class="nv">methode</span><span class="k">}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">[[</span><span class="nv">self</span><span class="k">]</span><span class="w"> </span><span class="nv">$methode</span><span class="k">]</span>
<span class="w"> </span><span class="k">}</span>
<span class="k">}</span>
<span class="c"># Erzeugen eines Objekts person der Klasse Person</span>
<span class="nv">Person</span><span class="w"> </span>create<span class="w"> </span>person<span class="w"> </span>Meier<span class="w"> </span>Franz
</pre></div>
<p>Die folgende Anweisung würde dann die Methode <code>getVorname</code> des Objekts <code>person</code> aufrufen und deren Rückgabewert ausgeben.
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Der Vorname lautet [person rufe getVorname] "</span><span class="k">;</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<div class="sisterproject" style="margin:0.1em 0 0 0;"><span class="noviewer" style="display:inline-block; line-height:10px; min-width:1.6em; text-align:center;" aria-hidden="true" role="presentation"><span class="mw-default-size" typeof="mw:File"><span title="Wiktionary"></span></span></span><b><a href="https://de.wiktionary.org/wiki/Reflexion" class="extiw external" title="wikt:Reflexion">Wiktionary: Reflexion</a></b> – Bedeutungserklärungen, Wortherkunft, Synonyme, Übersetzungen</div>
<ul><li><style data-mw-deduplicate="TemplateStyles:r261891140">
/* start https://de.wikipedia.org/ */
.mw-parser-output .webarchiv-memento a{color:inherit}
/* end https://de.wikipedia.org/ */
</style><a rel="nofollow" class="external text" href="https://web.archive.org/web/20151217115512/http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_25_001.htm">Reflection und Annotationen</a> (<span class="webarchiv-memento"><a href="Webarchivierung#Begrifflichkeiten" title="Webarchivierung">Memento</a></span> vom 17. Dezember 2015 im <i><a href="Internet_Archive" title="Internet Archive">Internet Archive</a></i>)</li>
<li><a rel="nofollow" class="external text" href="http://msdn.microsoft.com/de-de/magazine/cc163408.aspx">Tiefe Einblicke in CLR: Reflection in .NET (C#)</a> im <a href="MSDN" class="mw-redirect" title="MSDN">MSDN</a></li>
<li><a rel="nofollow" class="external text" href="http://www.petendi.de/seminare/reflection/">Seminararbeit zum Thema reflexive Programmiersprachen (Konzepte und Umsetzung in Java)</a></li>
<li><a rel="nofollow" class="external text" href="http://php.net/manual/de/class.reflection.php">Reflection in PHP</a></li>
<li><a rel="nofollow" class="external text" href="http://smalltalk.gnu.org/">GNU Smalltalk</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Walter Cazzola: <a rel="nofollow" class="external text" href="http://www.jot.fm/issues/issue_2004_12/article6">"SmartReflection: Efficient Introspection in Java"</a>,
in Journal of Object Technology, vol. 3, no. 11, December 2004, Special issue: OOPS track at SAC 2004, Nicosia/Cyprus, pp. 117–132</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://docs.python.org/3/library/functions.html"><i>Built-in Functions.</i></a> In: <i>The Python Standard Library.</i> Python Software Foundation, 8. März 2023,<span class="Abrufdatum"> abgerufen am 8. März 2023</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3AReflexion+%28Programmierung%29&rft.title=Built-in+Functions&rft.description=Built-in+Functions&rft.identifier=https%3A%2F%2Fdocs.python.org%2F3%2Flibrary%2Ffunctions.html&rft.publisher=Python+Software+Foundation&rft.date=2023-03-08&rft.language=en"> </span></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://docs.python.org/3/reference/datamodel.html"><i>3. Data model.</i></a> In: <i>The Python Standard Library.</i> Python Software Foundation, 8. März 2023,<span class="Abrufdatum"> abgerufen am 8. März 2023</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3AReflexion+%28Programmierung%29&rft.title=3.+Data+model&rft.description=3.+Data+model&rft.identifier=https%3A%2F%2Fdocs.python.org%2F3%2Freference%2Fdatamodel.html&rft.publisher=Python+Software+Foundation&rft.date=2023-03-08&rft.language=en"> </span></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://docs.python.org/3/library/inspect.html"><i>inspect — Inspect live objects.</i></a> In: <i>Python Software Foundation.</i> The Python Standard Library, 8. März 2023,<span class="Abrufdatum"> abgerufen am 8. März 2023</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3AReflexion+%28Programmierung%29&rft.title=inspect+%E2%80%94+Inspect+live+objects&rft.description=inspect+%E2%80%94+Inspect+live+objects&rft.identifier=https%3A%2F%2Fdocs.python.org%2F3%2Flibrary%2Finspect.html&rft.publisher=The+Python+Standard+Library&rft.date=2023-03-08&rft.language=en"> </span></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2024-12-23" href="https://de.wikipedia.org/wiki/?title=Reflexion_(Programmierung)&oldid=251526777">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>